package com.mysqlpass.update.service.impl;

import com.mysqlpass.update.model.UpdateInfo;
import com.mysqlpass.update.service.UpdateService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 更新服务接口的实现类
 */
@Service
public class UpdateServiceImpl implements UpdateService {
    
    private static final Logger logger = Logger.getLogger(UpdateServiceImpl.class.getName());
    
    @Value("${update.file.current-version}")
    private String currentVersion;
    
    @Value("${update.file.latest-version}")
    private String latestVersion;
    
    @Override
    public UpdateInfo checkUpdate(String clientVersion) {
        logger.info(String.format("开始执行更新检查，客户端版本: '%s', 系统配置当前版本: '%s', 系统配置最新版本: '%s'", 
                clientVersion, currentVersion, latestVersion));
        
        try {
            // 创建更新信息对象
            UpdateInfo updateInfo = new UpdateInfo();
            updateInfo.setCurrentVersion(clientVersion);
            updateInfo.setLatestVersion(latestVersion);
            updateInfo.setReleaseDate(new Date());
            
            // 比较版本号，确定是否需要更新
            boolean needUpdate = compareVersions(clientVersion, latestVersion);
            updateInfo.setNeedUpdate(needUpdate);
            
            // 如果需要更新，设置下载链接和更新描述
            if (needUpdate) {
                logger.info(String.format("检测到客户端版本 '%s' 需要更新到最新版本 '%s'", 
                        clientVersion, latestVersion));
                updateInfo.setDownloadUrl("/api/update/download");
                updateInfo.setUpdateDescription("新版本发布，包含性能优化和bug修复。建议所有用户更新。");
            } else {
                logger.info(String.format("客户端版本 '%s' 已是最新版本或无需更新", clientVersion));
            }
            
            logger.fine(String.format("更新检查结果: %s", updateInfo.toString()));
            return updateInfo;
        } catch (Exception e) {
            logger.log(Level.SEVERE, String.format("更新检查过程中发生错误: %s", e.getMessage()), e);
            // 发生异常时，返回默认的更新信息
            UpdateInfo errorUpdateInfo = new UpdateInfo();
            errorUpdateInfo.setCurrentVersion(clientVersion);
            errorUpdateInfo.setLatestVersion(latestVersion);
            errorUpdateInfo.setNeedUpdate(false);
            errorUpdateInfo.setReleaseDate(new Date());
            errorUpdateInfo.setUpdateDescription("检查更新时发生错误，请稍后再试");
            return errorUpdateInfo;
        }
    }
    
    @Override
    public boolean compareVersions(String clientVersion, String latestVersion) {
        logger.fine(String.format("比较版本号，客户端版本: '%s', 最新版本: '%s'", clientVersion, latestVersion));
        
        // 简单的版本比较逻辑，实际应用中可能需要更复杂的比较
        // 这里假设版本号格式为 x.y.z
        try {
            String[] clientParts = clientVersion.split("\\.");
            String[] latestParts = latestVersion.split("\\.");
            
            logger.finest(String.format("客户端版本分解: %s", Arrays.toString(clientParts)));
            logger.finest(String.format("最新版本分解: %s", Arrays.toString(latestParts)));
            
            int minLength = Math.min(clientParts.length, latestParts.length);
            
            for (int i = 0; i < minLength; i++) {
                try {
                    int clientNum = Integer.parseInt(clientParts[i]);
                    int latestNum = Integer.parseInt(latestParts[i]);
                    
                    logger.finest(String.format("比较第%d位: 客户端=%d, 最新版本=%d", i, clientNum, latestNum));
                    
                    if (clientNum < latestNum) {
                        logger.fine(String.format("版本比较结果: 客户端版本 '%s' 低于最新版本 '%s'，需要更新", 
                                clientVersion, latestVersion));
                        return true;
                    } else if (clientNum > latestNum) {
                        logger.fine(String.format("版本比较结果: 客户端版本 '%s' 高于最新版本 '%s'，不需要更新", 
                                clientVersion, latestVersion));
                        return false;
                    }
                    // 如果相等，继续比较下一位
                } catch (NumberFormatException e) {
                    // 如果版本号格式不符合预期，默认不需要更新
                    logger.warning(String.format("版本号格式错误，客户端版本: '%s', 最新版本: '%s', 错误: %s", 
                            clientVersion, latestVersion, e.getMessage()));
                    return false;
                }
            }
            
            // 如果前面的数字都相同，比较长度
            boolean result = clientParts.length < latestParts.length;
            logger.fine(String.format("版本比较结果: 客户端版本 '%s' %s 最新版本 '%s'，%s更新", 
                    clientVersion, (result ? "低于" : "等于或高于"), latestVersion, (result ? "需要" : "不需要")));
            return result;
        } catch (Exception e) {
            logger.log(Level.SEVERE, String.format("版本比较过程中发生错误: %s", e.getMessage()), e);
            return false;
        }
    }
}